from rest_framework import serializers
from django.db import models

# Create your models here.
from django.shortcuts import render
from django.db import models
#导包公共属性类
from utils.models import  BaseModel
# Create your views here.
class GoodsCategory(BaseModel):
    """商品分类"""
    name=models.CharField(max_length=10,verbose_name="名称")
    #外键就是自己，parent_id 形成树形结构
    parent=models.ForeignKey('self',related_name='subs',null=True,blank=True,on_delete=models.CASCADE,verbose_name='父类别')
    class Meta:
        db_table='tb_goods_category'
        verbose_name='商品类别'
        verbose_name_plural=verbose_name

    def __str__(self):
        return self.name


class GoodsCategorySerializer(serializers.ModelSerializer):
    subs = serializers.SerializerMethodField()

    class Meta:
        model = GoodsCategory
        fields = ['id', 'name', 'parent_id', 'subs']

    def get_subs(self, obj):
        if obj.subs.exists():
            return GoodsCategorySerializer(obj.subs.all(), many=True).data
        return []

class GoodsChannelGroup(BaseModel):
    """商品频道组"""
    name=models.CharField(max_length=20,verbose_name='频道组名')

    class Meta:
        db_table='tb_goods_channel_group'
        verbose_name='商品频道组'
        verbose_name_plural=verbose_name

    def __str__(self):
        return self.name

class GoodsChannel(BaseModel):
     """商品频道"""
     #商品频道组 外键
     group=models.ForeignKey(GoodsChannelGroup,on_delete=models.CASCADE,verbose_name='频道组名')
     #商品分类 外键
     category=models.ForeignKey(GoodsCategory,on_delete=models.CASCADE,verbose_name='顶级商品类名')
     url=models.CharField(max_length=100,verbose_name='频道页面链接')
     sequence=models.IntegerField(verbose_name='组内顺序')

     class Meta:
         db_table='tb_goods_channel'
         verbose_name='商品频道'
         verbose_name_plural=verbose_name

     def __str__(self):
         return self.category.name

class Brand(BaseModel):
      """品牌"""
      name=models.CharField(max_length=20,verbose_name='名称')
      logo=models.ImageField(verbose_name='Logo图片')
      first_letter=models.CharField(max_length=1,verbose_name='品牌首字母')

      class Meta:
          db_table='tb_brand'
          verbose_name='品牌'
          verbose_name_plural=verbose_name

      def __str__(self):
          return self.name

class SPU(BaseModel):
    """商品SPU"""
    name=models.CharField(max_length=50,verbose_name='名称')
    #外键 和 品牌进行关联
    brand=models.ForeignKey(Brand,on_delete=models.PROTECT,verbose_name='品牌')
    category1=models.ForeignKey(GoodsCategory,on_delete=models.PROTECT,related_name='cat1_spu',verbose_name='一级类别')
    category2=models.ForeignKey(GoodsCategory,on_delete=models.PROTECT,related_name='cat2_spu',verbose_name='二级类别')
    category3=models.ForeignKey(GoodsCategory,on_delete=models.PROTECT,related_name='cat3_spu',verbose_name='三级类别')
    sales=models.IntegerField(default=0,verbose_name='销量')
    comments=models.TextField(default='',verbose_name='评价数')
    desc_detail=models.TextField(default='',verbose_name='详细介绍')
    desc_pack=models.TextField(default='',verbose_name='包装信息')
    desc_service=models.TextField(default='',verbose_name='售后服务')

    class Meta:
        db_table='tb_spu'
        verbose_name='商品SPU'
        verbose_name_plural=verbose_name

    def __str__(self):
        return self.name

class SKU(BaseModel):
    """商品SKU"""
    name=models.CharField(max_length=50,verbose_name='名称')
    caption=models.CharField(max_length=100,verbose_name='副标题')
    #SPU外键
    spu=models.ForeignKey(SPU,on_delete=models.CASCADE,verbose_name='商品')
    #商品类型外键
    category=models.ForeignKey(GoodsCategory,on_delete=models.PROTECT,verbose_name='从属类别')
    price=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='单价')
    cost_price=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='进价')
    market_price=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='市场价')
    stock=models.IntegerField(default=0,verbose_name='库存')
    sales=models.IntegerField(default=0,verbose_name='销量')
    comments=models.IntegerField(default=0,verbose_name='评价数')
    is_launched=models.BooleanField(default=True,verbose_name='是否上架销售')
    default_image=models.ImageField(max_length=200,default='',null=True,blank=True,verbose_name='默认图片')

    class Meta:
        db_table='tb_sku'
        verbose_name='商品SKU'
        verbose_name_plural=verbose_name
    def __str__(self):
        return '%s-%s'%(self.name,self.spu)

class SKUImage(BaseModel):
    """SKU图片"""
    sku=models.ForeignKey(SKU,on_delete=models.CASCADE,verbose_name='sku')
    image=models.ImageField(verbose_name='图片')

    class Meta:
        db_table='tb_sku_image'
        verbose_name='SKU图片'
        verbose_name_plural=verbose_name

    def __str__(self):
        return '%s-%s'%(self.sku.name,self.id)

class SPUSpecification(BaseModel):
     """商品SPU规格"""
     spu=models.ForeignKey(SPU,on_delete=models.CASCADE,related_name='specs',verbose_name='商品SPU')
     name=models.CharField(max_length=20,verbose_name='规格名称')

     class Meta:
         db_table='tb_spu_specification'
         verbose_name='商品SPU规格'
         verbose_name_plural=verbose_name

     def __str__(self):
         return '%s-%s'%(self.spu.name,self.name)

class SpecificationOption(BaseModel):
      """规格选项"""
      spec=models.ForeignKey(SPUSpecification,related_name='options',on_delete=models.CASCADE,verbose_name='规格')
      value=models.CharField(max_length=20,verbose_name='选项值')

      class Meta:
          db_table='tb_specification_option'
          verbose_name='规格选项'
          verbose_name_plural=verbose_name

      def __str__(self):
          return '%s-%s'%(self.spec,self.value)


class  SKUSpecification(BaseModel):
       """SKU具体规格"""
       sku=models.ForeignKey(SKU,on_delete=models.CASCADE,related_name='specs',verbose_name='sku')
       spec=models.ForeignKey(SPUSpecification,on_delete=models.PROTECT,verbose_name='规格名称')
       option=models.ForeignKey(SpecificationOption,on_delete=models.PROTECT,verbose_name='规格值')

       class Meta:
           db_table='tb_sku_specification'
           verbose_name='SKU规格'
           verbose_name_plural=verbose_name

       def __str__(self):
           return '%s-%s'%(self.sku,self.spec.name,self.option.value)